package com.qfedu.buy.server.controller;

import com.qfedu.buy.server.core.wxpay.WxPayUtil;
import com.qfedu.buy.server.util.XmlUtil;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.InputStream;
import java.util.Map;
import java.util.TreeMap;

/**
 * @program: NeighborBuy
 * @description:
 * @author: Feri(邢朋辉)
 * @create: 2021-02-01 11:18
 */
@Controller
@RequestMapping("/pay/")
public class PayCallBackController {
    //微信支付的回调接口
    @RequestMapping("/wxpay/notify.do")
    public void wxcb(HttpServletRequest request){
        //回调通过数据流的形式
        try {
            InputStream is=request.getInputStream();
            byte[] data=new byte[2048];
            int len;
            StringBuffer buffer=new StringBuffer();
            while ((len=is.read(data))!=-1){
                buffer.append(new String(data,0,len));
            }
            //解析xml
            Map<String,String> response=XmlUtil.parseXml(buffer.toString());
            if(response!=null && response.size()>0){
                //验证签名
                String sign=response.get("sign");
                TreeMap<String,String> map=new TreeMap<>();
                for(String s:response.keySet()){
                    String v=response.get(s);
                    if(v!=null && v.length()>0){
                        if(!s.equals("sign")){
                            map.put(s,v);
                        }
                    }
                }
                String mysign= WxPayUtil.createSign(map);
                if(sign.equals(mysign)){
                    //签名一致 说明数据对应
                    //查询数据库 校验金额
                    //商户系统对于支付结果通知的内容一定要做签名验证,并校验返回的订单金额是否与商户侧的订单金额一致，防止数据泄漏导致出现“假通知”，造成资金损失
                    //更新订单的支付状态
                    //返回结果
                    
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
